package com.hc.componentspringboot;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.hc.componentspringboot.mapper")//替代@Mapper统一扫描传统方式mybatis的mapper接口
@SpringBootApplication
public class ComponentSpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(ComponentSpringbootApplication.class, args);
    }

    /**
     * Springboot整合mybatis
     * 1.导入依赖
     * 2.配置数据源连接信息
     * 3.可选配置连接池druid
     * 4.基于xml/注解方式整合mybatis
     */
    /**
     * 1.谈谈你对Springboot的理解，它有哪些特性
     *      Springboot是用来快速开发Spring应用的一个脚手架，用于简化Spring应用的搭建及开发过程
     *      1）提供了很多的starter，结合自动配置，对主流框架无配置集成，开箱即用
     *      2）采用JavaConfig的方式实现零xml的方式开发
     *      3）内置了Web容器，不依赖外部Web服务器，省略了Web.xml，直接运行jar就可以启动应用
     *      4）管理了常用的第三方依赖的版本，减少了版本冲突的问题
     *      5）自带监控功能，监控应用的运行状况，内存，线程池，请求统计等，提供了优雅关闭应用的功能
     * 2.Springboot的核心注解
     *      1）@SpringbootApplication：标记为Springboot应用
     *      2）@SpringbootConfiguration：标记启动类为配置类
     *      3）@EnableAutoConfiguration：启动自动配置功能
     *      4）@ConditionalXXX：表名需要满足某些条件才启用自动配置
     * 3.Springboot自动装配原理
     *      1）通过@SpringBootApplication引入了@EnableAutoConfiguration启动自动配置功能
     *      2）@EnableAutoConfiguration引入了@Import
     *      3）Spring容器启动时会加载@Import
     *      4）@Import导入了DeferredImportSelector，其会使SpringBoot自动配置类的顺序在最后加载，方便我们扩展
     *      5）读取所有META-INF下的spring.factories文件
     *      6）过滤出所有AutoConfigurationClass类型的类
     *      7）最后通过@Condition排除无效的自动配置类
     * 4.Springboot启动原理
     *      1）初始化SpringApplication实例
     *      2）加载配置文件和环境变量
     *      3）创建应用上下文，读取启动类
     *      4）加载IOC容器和所有自动配置类
     *      5）在这个过程中会调用很多监听器完成对外扩展
     * 5.Springboot的jar为什么可直接运行
     *      1）Springboot提供了插件用于将应用打成可执行的jar包
     *      2）应用打包之后，生成一个fat jar，包含了应用依赖的jar包和Springboot loader相关的类
     *      3）当执行java -jar命令时，会寻找jar包中的manifest文件，在其中找真正的主类
     *      4）该主类的就是一个Jarlauncher，它负责创建一个类加载器来加载lib下的所有的jar，并启动一个线程来启动应用启动类
     * 6.Springboot内置Tomcat启动原理
     *      1）需要添加web场景启动器，然后Springboot会添加一个Servlet容器自动配置类，该类会决定使用哪个web容器
     *      2）默认会启用内嵌的Tomcat，并配置一个Tomcat服务工厂
     *      3）Springboot启动时会创建Spring容器，解析自动配置类，获取Tomcat服务工厂
     *      4）通过getWebServer启动Tomcat并挂起等待请求
     * 7.Springboot读取配置文件原理和加载顺序
     *      1）启动时通过事件监听方式
     *      2）高优先级覆盖低优先级，并形成互补
     * 8.Springboot默认日志框架是什么，如何切换别的
     *      1）默认logback
     *      2）排除logging场景启动器，添加slf4j对应的桥接器和适配器
     * 9.如何在Springboot上作扩展
     *      1）最有效率的方式百度
     *      2）查看自动配置类源码，根据条件配置或实现对外提供的接口等
     * 10.Springboot中的starter是干什么的
     *      1）为我们提供了某个服务场景的一系列依赖，导入starter后，Springboot会完成组件的自动导入和配置
     * 11.Springboot有哪些方式加载配置
     *      1）直接在项目中提供Springboot支持的配置文件
     *      2）项目启动时通过命令行传递参数，用于临时修改配置
     * 12.Springboot读取配置的方式有哪些
     *      1）@Value直接注入对应值
     *      2）@ConfigurationProperties将对应值绑定到一个配置对象上，把该对象注入到需要的地方
     *      3）@PropertySource直接读取配置文件，在用@Value注入对应值
     * 13.Springboot如何实现异步调用
     *      1）在启动类上加@EnableAsync，开启异步调用
     *      2）在方法上加@Async
     * 14.Springboot如何实现定时任务
     *      1）在启动类上加@EnableScheduling，在方法上加@Scheduled
     *      2）使用Quartz等开源框架
     *      3）实现原生JDK的ScheduleExcutorService接口
     * 15.Springboot如何解决跨域问题
     *      1）实现WebMmcConfigurar
     *      2）添加全局过滤器
     *      3）在特点方法上加@CrossOrigin
     * 16.拦截器和过滤器的区别
     *      1）过滤器属于JavaWeb技术，依赖Servlet容器，拦截器属于Spring技术
     *      2）过滤器基于函数回调方式，拦截器基于Java反射机制
     *      3）过滤器在前端控制器之前执行，拦截器在前端控制器之后执行
     * 17.什么是JavaConfig
     *      是Spring框架提供的一种基于Java类的配置方式，使用@Configuration和@Bean简化了传统xml的配置方式
     * 18.如何在Springboot启动时执行特定的代码
     *      1）实现CommmandLineRunner或ApplicationRunner接口
     *      2）通过Springboot事件机制，实现ApplicationListener接口
     * 19.Spring的全局异常处理
     *      使用@ControllerAdvice开启全局异常捕获，使用@ExceptionHander定义具体的异常类型
     * 20.Springboot如何防止反编译
     *      1）使用classfinal插件，完成相关配置，适合多模块项目
     *      2）使用proguard插件，适合单模块项目
     * 21.Springboot如何优化启动速度
     *      1）延迟初始化Bean
     *      2）创建扫描索引
     *      3）升级Springboot3将应用编译成本地可执行镜像文件
     * 22.Springboot可以同时处理多少请求
     *      最大等待数100+最大连接器8192=8292
     */
}
